package com.shujia

object Demo9Function {
  def main(args: Array[String]): Unit = {

    /**
     * 面向对象编程
     * 1、将对象传来传去，以对象作为参数或者以对象作为返回值
     * 面向函数编程（相对于中的匿名内部类（lambda表达式）） -- 高阶函数
     * 2、将函数传来传去，以函数作为参数或者以函数作为返回值
     *
     */

    /**
     * 1、函数的类型描述
     * 1、函数的类型和参数类型返回值类型相关
     * intToString:是一个参数位INt返回值位String类型的函数（Int => String）
     *
     */

    def intToString(x: Int): String = {
      x.toString
    }

    //通过一个变量指向一个函数
    val fun: Int => String = intToString
    println(fun(100))


    /**
     * 2、以函数作为参数 -- 重点
     * 作用：将函数中的代码逻辑抽象出来，以函数作为参数传进去，实现代码逻辑封装
     */

    def function(f: String => Int): Unit = {
      println("function被调用")
      //调用传进来的函数
      val i: Int = f("100")
      println(i)
    }


    //fun1是一个参数为String返回值为Int类型的函数
    def fun1(str: String): Int = {
      println("fun1被调用")
      str.toInt + 100
    }

    //嗲用functino需要传输一个参数位String返回值为Int类型的函数
    println("执行function")
    function(fun1)

    //使用lambda表达式简化函数的调用
    function((str: String) => {
      str.toInt + 1
    })

    //简写
    //1、如果函数体只有一行可以省略括号
    function((str: String) => str.toInt * 100)
    //2、参数类型可以省略，scala会自动推断
    function(str => str.toInt + 100)
    //3、如果参数只使用了一次可以使用下划线代替
    function(_.toInt + 100)

  }

}
